import java.awt.Color
import java.awt.Font
import java.awt.Graphics2D
import java.awt.RenderingHints
import java.awt.geom.Rectangle2D
import java.awt.image.BufferedImage

class CaptchaController {

    private static final String SOURCECHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    def index = {
        response.setContentType("image/png");
        response.setHeader("Cache-control", "no-cache");

        // Generate and remember the Source Character string (6 characters)
        int l = SOURCECHARS.length();
        StringBuffer b = new StringBuffer();
        6.times {
            int r = (int) (Math.random() * l);
            b.append(SOURCECHARS.charAt(r));
        }

        final int height = 200;
        final int width = 200;
        final int space = 8;

        System.setProperty("java.awt.headless", "true");
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        Font font = new Font("Serif", Font.BOLD, 18);
        g2d.setFont(font);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        Rectangle2D fontRect = font.getStringBounds(b.toString(), g2d.getFontRenderContext());
        // Now, create a graphic "space" pixels wider and taller than the the font
        bufferedImage = new BufferedImage((int) fontRect.getWidth() + space,
                (int) fontRect.getHeight() + space,
                BufferedImage.TYPE_INT_RGB);
        g2d = bufferedImage.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setFont(font);

        // Draw the background
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);

        // Draw the lines
        g2d.setColor(Color.GRAY);
        int x1, y1, x2, y2;
        final int step = 10;
        x1 = 0;
        y1 = step;
        x2 = step;
        y2 = 0;
        while (x1 < width || x2 < width || y1 < height || y2 < height)
        {
            g2d.drawLine(x1, y1, x2, y2);
            if (y1 < height)
            {
                x1 = 0;
                y1 += step;
            }
            else if (x1 < width)
            {
                y1 = height;
                x1 += step;
            }
            else
            {
                x1 = width;
                y1 = height;
            }

            if (x2 < width)
            {
                y2 = 0;
                x2 += step;
            }
            else if (y2 < height)
            {
                x2 = width;
                y2 += step;
            }
            else
            {
                y2 = height;
                x2 = width;
            }
        }

        // Draw the String
        g2d.setColor(Color.BLACK);

        g2d.drawString(b.toString(), (int) (space / 2), (int) (space / 4) + (int) fontRect.getHeight());

        OutputStream out = response.getOutputStream();
        javax.imageio.ImageIO.write(bufferedImage, "PNG", out);
        out.close();
        //def session = request.getSession(true);
        session.setAttribute("captcha", b.toString());
    }
}